iT邦幫忙

2025 iThome 鐵人賽

DAY 22
0

Retrofit是,由 Square 開發的 Android/Java HTTP 網路請求函式庫,是專為API連線而生的第三方套件,與API連線的效率非常高。它的特點是簡單、型別安全、易於擴充,可以將 API 請求轉換成介面(interface)方法呼叫,並自動處理 JSON/XML 解析。

可能看起來比較難理解,相信實作一次後就比較能理解了

首先請先到build.grade(Module: app)的dependencies加入這兩行。

dependencies {
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
}

然後到AndroidManifest.xml加入網路權限

<uses-permission android:name="android.permission.INTERNET" />

API(Application Programming Interface,應用程式介面)

先說明一下,API是 App 跟伺服器溝通的規則和通道 舉例來說就是程式和伺服器調取資料後,再回傳給程式做計算或顯示。

需要創建的比較多,創建完會長這樣,以下是每一頁面的說明

image

引入套件

import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.Callback;
import retrofit2.Response;
import android.util.Log;

1. 資料類別(Data Model): Post.java

  • 定義與 API 回傳 JSON 欄位對應的類別。
  • Retrofit 用 Gson 會自動將 JSON 轉成這個類別的物件。

代表一筆從 API 拿到的文章資料(或貼文) 接收到 JSON 之後會自動把資料填入這個類別

public class Post {
    private String id; //欄位名稱要跟API欄位名稱一致
    private String title;
    private String body;
    private String userId;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body = body;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }
}

2. API 接口(ApiService.java)

  • 定義每個 API 呼叫的路徑、方法(GET、POST等)與回傳資料型別。
  • Retrofit 會依照這個接口自動生成網路請求。
import retrofit2.Call;
import retrofit2.http.GET;

//各個連線的接口,每個連線是用GET或POST及其路徑、參數都寫在這裡
public interface ApiService {
    @GET("posts/1")    // GET 請求,路徑為 posts/1
    Call<Post> getPost();  // 回傳 Post 物件,方法名稱為 getPost
}

3. Retrofit 建立器(ApiClient.java)

  • 建立 Retrofit 實例,設定 baseUrl 和 JSON 轉換器。
  • 提供 ApiService 實例讓 App 其他部分呼叫 API。
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class ApiClient {
    private ApiService apiService;
    public ApiService getApiService() {
        //建立一個 Retrofit 的建構器
        retrofit2.Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://jsonplaceholder.typicode.com/")    //API 的基本網址(主機地址)
                .addConverterFactory(GsonConverterFactory.create())  // 用 Gson 轉 JSON
                .build();
        //利用 Retrofit 實例產生 ApiService 的實作物件,這樣你就可以用它來呼叫 API。
        apiService = retrofit.create(ApiService.class);
        return apiService;
    }
}

4. 呼叫範例(MainActivity.java)

  • 實際呼叫 API 並使用 Callback 接收結果。
  • 用Log.d列印輸出
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //建立 ApiClient 物件實例,用來管理 Retrofit 連線
        ApiClient apiClient = new ApiClient();
        
        //呼叫 apiClient 裡的 getApiService() 取得 API 介面實例。
        //呼叫 getPost() 執行 API 請求(取得資料)
        //用 enqueue() 非同步執行(在背景執行)請求,並監聽Callback(回傳結果) 。
        apiClient.getApiService().getPost().enqueue(new Callback<Post>() {
        
            @Override
            //回傳成功(主執行緒)
            public void onResponse(Call<Post> call, Response<Post> response) {
                //取得伺服器回傳的 Post 物件並用 Log 輸出(透過 Gson 自動解析 JSON)
                Log.d("note", response.body().getId());
                Log.d("note", response.body().getUserId());
                Log.d("note", response.body().getTitle());
                Log.d("note", response.body().getBody());
            }
            
            //回傳失敗
            @Override
            public void onFailure(Call<Post> call, Throwable t) {
                //將錯誤訊息印到 Log
                Log.d("note", "response: " + t.toString());
            }
        });
    }
}

執行成果展示:
image


上一篇
Day 21.TabLayout + ViewPager2
系列文
Android 新手的 30 天進化論:從初學者到小專案開發者22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言